Add nce_cost example with Readme#43
Conversation
nce_cost/README.md
Outdated
| TBD | ||
| # NCE加速词向量训练 | ||
| ## 背景介绍 | ||
| 在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。 |
There was a problem hiding this comment.
请不要直接抄其它篇目的一整段。。。
- 请解释一下大词表训练的性能瓶颈
- 即使是翻译论文的Introduction 部分。这个背景介绍请不要直接复制粘贴已有内容。已有内容请直接加交叉引用。
nce_cost/README.md
Outdated
| 在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。 | ||
|
|
||
| ## NCE Layer | ||
| NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,原理是通过构造一个逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的label作为正样例,同时采样出K个其他的label作为负样例,从而只需要计算样本在这K+1个label上的概率,原始的softmax分类需要计算每个类别的分数,然后归一化得到概率,这个计算过程是十分耗时的。 |
There was a problem hiding this comment.
关于这里,我一直在考虑怎么表述,这里可以通过公式来表达吗?或者有没有描述比较清楚的文档?
| ## 训练阶段 | ||
| 训练直接运行``` python train.py ```。程序第一次运行会检测用户缓存文件夹中是否包含imikolov数据集,如果未包含,则自动下载。运行过程中,每1000个iteration会打印模型训练信息,主要包含训练损失,每个pass计算一次测试损失,并会保存一次模型。 | ||
|
|
||
| ## 预测阶段 |
There was a problem hiding this comment.
NCE 预测没有讲清楚。
- 为什么训练和预测不一样,要换层?
- 怎么共享参数?
| 图1. 网络配置结构 | ||
| </p> | ||
|
|
||
| ## 训练阶段 |
There was a problem hiding this comment.
这里面没有任何详细的信息。请参考其它demo,
- 请参考文本分类,词向量两个PR的写作方式。
- 请解释一下NCE层如何使用,几个参数如何设置,如何影响模型的学习效果。
There was a problem hiding this comment.
整个训练阶段和预测阶段,请重新修改。
- NCE层的使用和参数仍然不够清晰,请列点来表达。
- 描述过于口语化,请修改。
nce_cost/README.md
Outdated
| # NCE加速词向量训练 | ||
| ## 背景介绍 | ||
| 在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。 | ||
| 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。 |
There was a problem hiding this comment.
- 本文NPLM模型也是n-gram, 这里所知的“n-gram传统模型”是特指table-lookup形式的LM?描述上请和book中的 n-gram neural model 区分。并且请注意,NCE不仅仅用于语言模型,该表述容易让人有歧义。
- (NPLM) 改为(Neural Probabilistic Language Model, NPLM)
- 性能包括训练效率,“优异的性能”和“漫长的训练时间”前后矛盾?
- 使用率低于n-gram, 不仅仅是因为训练缓慢,infer费时也是一个原因。所以最好说训练时间漫长是其中的一个原因。
- 词汇--》字典?
- 第一次提到”神经概率语言模型“,最好简要描述下是什么样的模型,用来干什么。
- 英文和中文之间除非有标点,否则建议增加一个空格,例如n-gram前后增加空格,下同。
nce_cost/README.md
Outdated
| ## 背景介绍 | ||
| 在自然语言处理领域中,传统做法通常使用one-hot向量来表示词,比如词典为['我', '你', '喜欢'],可以用[1,0,0]、[0,1,0]和[0,0,1]这三个向量分别表示'我'、'你'和'喜欢'。这种表示方式比较简洁,但是当词表很大时,容易产生维度爆炸问题;而且任意两个词的向量是正交的,向量包含的信息有限。为了避免或减轻one-hot表示的缺点,目前通常使用词向量来取代one-hot表示,词向量也就是word embedding,即使用一个低维稠密的实向量取代高维稀疏的one-hot向量。训练词向量的方法有很多种,神经网络模型是其中之一,包括CBOW、Skip-gram等,这些模型本质上都是一个分类模型,当词表较大即类别较多时,传统的softmax将非常消耗时间。PaddlePaddle提供了Hsigmoid Layer、NCE Layer,来加速模型的训练过程。本文主要介绍如何使用NCE Layer来加速训练,词向量相关内容请查阅PaddlePaddle Book中的[词向量章节](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)。 | ||
| 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。 | ||
| NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。 |
There was a problem hiding this comment.
- 连续分布还是离散分布?
- 去掉”所产生的“
- ”重要性采样“,专有名词的出现,请加参考论文。
- ”需要的噪音样本“容易有歧义,”噪音“不被需要。
nce_cost/README.md
Outdated
| ## 数据准备 | ||
| ### PTB数据 | ||
| 本文采用Penn Treebank (PTB)数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)),共包含train、valid和test三个文件。其中使用train作为训练数据,valid作为测试数据。本文训练的是5-gram模型,即用每条数据的前4个词来预测第5个词。PaddlePaddle提供了对应PTB数据集的python包[paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py) ,自动做数据的下载与预处理。预处理会把数据集中的每一句话前后加上开始符号\<s>以及结束符号\<e>,然后依据窗口大小(本文为5),从头到尾每次向右滑动窗口并生成一条数据。如"I have a dream that one day"可以生成\<s> I have a dream、I have a dream that、have a dream that one、a dream that one day、dream that one day \<e>,PaddlePaddle会把词转换成id数据作为预处理的输出。 | ||
| NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,目的是用来提高训练速度并改善所得词向量的质量。与h-sigmoid[[2](#参考文献)\]相比,NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。 |
There was a problem hiding this comment.
- Noise-contrastive estimation (NCE) [1]
- h-sigmoid 首次使用,最好用全称,较为正式
- ”这样能够大幅度提升计算性能“ 避免口语化,建议”以大幅提升计算效率”。其他地方也请注意避免口语化。
nce_cost/README.md
Outdated
| 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。 | ||
| NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。 | ||
|
|
||
| ## 实验数据 |
nce_cost/README.md
Outdated
| NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。 | ||
|
|
||
| ## 实验数据 | ||
| 本文采用Penn Treebank (PTB)数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)),这是一个用来训练语言模型的数据集,给出前4个词让语言模型预测第5个词。PaddlePaddle提供[paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py)接口来方便调用数据,其中实现了数据自动下载,字典生成,滑动窗口等功能。 |
There was a problem hiding this comment.
对PTB的描述有偏:PTB本身不是用来”给出前4个词让语言模型预测第5个词“,仅仅是这里的n-gram neural language model 这么预处理数据。
nce_cost/README.md
Outdated
|
|
||
| - **输入层**:ptb的样本由原始的英文单词组成,将每个英文单词转换为字典中的id表示。 | ||
|
|
||
| - **词向量层**:使用定义好的embedding矩阵,将原先的id表示转换为向量表示。这种将英文单词转换为词向量的方法,比传统的one-hot表示更能体现词语的语义内容,关于词向量的更多信息请参考PaddleBook中的[词向量](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)一节。 |
There was a problem hiding this comment.
“定义好的” 描述不严谨,它是”tranable“的。
nce_cost/README.md
Outdated
|
|
||
| - **词向量层**:使用定义好的embedding矩阵,将原先的id表示转换为向量表示。这种将英文单词转换为词向量的方法,比传统的one-hot表示更能体现词语的语义内容,关于词向量的更多信息请参考PaddleBook中的[词向量](https://github.com/PaddlePaddle/book/tree/develop/04.word2vec)一节。 | ||
|
|
||
| - **词向量拼接层**:将词向量进行并联,就是将向量沿feature边依次拼接在一起形成一个矩阵。 |
There was a problem hiding this comment.
向量拼接是指收尾相连,形成一个长向量,非矩阵。同时这里的描述过于口语化。
feature --》 注意不要随意使用英文,能用中文则使用中文,有必要时可括号注明对应英文。
nce_cost/README.md
Outdated
|
|
||
| - **词向量拼接层**:将词向量进行并联,就是将向量沿feature边依次拼接在一起形成一个矩阵。 | ||
|
|
||
| - **全连接隐层**:将上一层获得的词向量矩阵输入一层隐层的神经网络, |
nce_cost/README.md
Outdated
|
|
||
| - **全连接隐层**:将上一层获得的词向量矩阵输入一层隐层的神经网络, | ||
|
|
||
| - **NCE层**:推断时,输出层的神经元数量和样本的类别数一致,在这里就是整个字典的大小,最后使用softmax对每个类别的概率做一个归一化操作,因此第$i$个神经元的输出就可以认为是样本属于第$i$类的预测概率。训练时,我们需要构造一个二分类分类器,万幸的是paddle已经帮助我们实现了这一切。 |
There was a problem hiding this comment.
- ”万幸的是paddle已经帮助我们实现了这一切。“ 请避免口语化。
- 请更为严谨的表达在train和infer时,NCE层的不同。
| 图1. 网络配置结构 | ||
| </p> | ||
|
|
||
| ## 训练阶段 |
There was a problem hiding this comment.
整个训练阶段和预测阶段,请重新修改。
- NCE层的使用和参数仍然不够清晰,请列点来表达。
- 描述过于口语化,请修改。
nce_cost/README.md
Outdated
| @@ -1 +1,71 @@ | |||
| TBD | |||
| # NCE加速词向量训练 | |||
There was a problem hiding this comment.
NCE 在标题里改成中文。
使用噪声对比估计加速词向量训练。
nce_cost/README.md
Outdated
| TBD | ||
| # NCE加速词向量训练 | ||
| ## 背景介绍 | ||
| 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。 |
There was a problem hiding this comment.
- NPLM ,请在第一次出现的时候给英文全词拼接 + 逗号 + 英文缩写
- 但是其使用率仍然远远低于n-gram传统模型的使用 --> 这句话不通顺
- 这一段话请重写。
- 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。----> 请不要立这样简单粗暴的结论。
- 因为softmax需要全局的计算,必须考虑词汇中的所有单词。 --> 这句话没有信息量,什么叫“全局计算”,请保证在技术上是精确无歧义,可以被任何读者理解的。“全局计算”教科书和通用的技术文献中,不是一个广泛被接受的技术上精确的概念,请展开来解释。
There was a problem hiding this comment.
多谢指点~~
3.1 不是个人观点,是论文:A Fast and Simple Algorithm for Training Neural Probabilistic Language Models 摘要中的内容,考虑严谨性,已经删去。
问题done
nce_cost/README.md
Outdated
| # NCE加速词向量训练 | ||
| ## 背景介绍 | ||
| 神经概率语言模型 (NPLM) 尽管优异的性能,但是其使用率仍然远远低于n-gram传统模型的使用,这是由于其众所周知的漫长训练时间。训练 NPLM 计算开销很大,因为softmax需要全局的计算,必须考虑词汇中的所有单词。 | ||
| NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法,一种新的连续分布估计方法。这里我们使用了ptb数据来训练神经语言模型,并表明它减少了训练时间超过一个数量级, 而不影响所产生的模型的质量。该算法比重要性采样更有效而且更稳定, 因为它需要的噪音样本要少得多\[[1](#参考文献)\]。 |
There was a problem hiding this comment.
请务必保证技术的精确性和可推敲性。
-
NCE(Noise-contrastive estimation)是一种快速简便的训练 NPLM 的算法
- NCE 并不是专门为了训练LM而出现的,它涵盖的范围超过LM,请不要将它与LM强绑定在一起。
- NCE 不是一种“快速简便的训练 NPLM 的算法” 这个结论会令人误解。
- 快速简便的训练 --> 地,请区分 “的“”地“”得“。
-
并表明它减少了训练时间超过一个数量级, --> 我并没有在下文看到有所表明。
-
而不影响所产生的模型的质量 --> ”模型的质量“是如何度量的?请不要在没有给出数据的情况下,给出这种结论。这些近似估计都是有某些性能损失的。
-
因为它需要的噪音样本要少得多 --> 行文至此,”噪声样本“是一个前置概念。作为读者,至此我并不了解什么是噪音样本,在NCE里面有什么作用,为什么”噪音样本要少得多“ NCE 就比重要性采样效果好?
There was a problem hiding this comment.
多谢指点~~
3 不是个人观点,是论文:A Fast and Simple Algorithm for Training Neural Probabilistic Language Models 摘要中的内容,考虑严谨性,已经删去。
其他done
nce_cost/README.md
Outdated
| 本文采用Penn Treebank (PTB)数据集([Tomas Mikolov预处理版本](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)),这是一个用来训练语言模型的数据集,给出前4个词让语言模型预测第5个词。PaddlePaddle提供[paddle.dataset.imikolov](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/dataset/imikolov.py)接口来方便调用数据,其中实现了数据自动下载,字典生成,滑动窗口等功能。 | ||
|
|
||
| ## NCE Layer | ||
| NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,目的是用来提高训练速度并改善所得词向量的质量。与h-sigmoid[[2](#参考文献)\]相比,NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。 |
There was a problem hiding this comment.
- NCE是指Noise-contrastive estimation --> 请在第一次出现技术名词的时候给出全词和缩写,这里不要重复解释。
- 目的是用来提高训练速度并改善所得词向量的质量。
- 我不认为NCE能”改善所得词向量的质量“
- 这个质量是怎么度量的?有没有参考文献?有没有自己测试的数据呢?
- NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。
- hsigmoid没有使用Huffman 树,而是直接构建了一棵平衡二叉树。
- 相对简单的随机负采样,怎么简单?采样什么?怎采样?对学习效果一点影响都没有吗?采样有没有什么指导建议?
- 最后一句话,不如放在介绍完NCE之后来比较。
There was a problem hiding this comment.
2 引用于word2vec中的数学原理详解,考虑严谨性已经删去。
3 引用于word2vec中的数学原理详解,是否需要保留?不排除引用文的错误
nce_cost/README.md
Outdated
| ## NCE Layer | ||
| NCE Layer引用自论文\[[1](#参考文献)\],NCE是指Noise-contrastive estimation,目的是用来提高训练速度并改善所得词向量的质量。与h-sigmoid[[2](#参考文献)\]相比,NCE不再使用复杂的Huffman树来构造目标函数,而是采用相对简单的随机负采样,这样能够大幅度提升计算性能。 | ||
|
|
||
| NCE原理是通过构造一个逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的预测词label作为正样例,同时采样出K个其他词label作为负样例,从而只需要计算样本在这K+1个label上的概率。整体目标函数的目的就是增大正样本的概率同时降低负样本的概率。相比原始的softmax分类需要计算每个类别的分数,然后归一化得到概率,这个计算过程是十分耗时的。 |
There was a problem hiding this comment.
-
”NCE原理是通过构造一个逻辑回归(logistic regression),对正样例和负样例做二分类,对于每一个样本,将自身的预测词label作为正样例,同时采样出K个其他词label作为负样例,从而只需要计算样本在这K+1个label上的概率。“ --> 请调整说话/行文的顺序,概念和定义先行,其后才是基于概念/定义描述流程。
-
为什么NCE这样的估计方式可以近似逼近Softmax?复采样多少的时候近似效果比较好?
-
这里对比了softmax,上文对比hsigmoid,这些对比请放在一起,否则逻辑是分散散乱的。
There was a problem hiding this comment.
关于问题2 ,负采用个数这是一个经验性问题,本人并没有大量地做过实验,不敢下结论。我找下相关文献,然后添加进来。
其他问题done
nce_cost/README.md
Outdated
| ## 网络结构 | ||
| **模型的总体结构:** | ||
|
|
||
| 本文通过训练N-gram语言模型来获得词向量,具体地使用前4个词来预测当前词。网络输入为词在字典中的id,然后查询词向量词表获取词向量,接着拼接4个词的词向量,然后接入一个全连接隐层,最后是NCE Layer层。详细网络结构见图1: |
There was a problem hiding this comment.
- N-gram语言模型来获得词向量 --> 如果不不准备解释这个模型的细节,请引导至BOOK。
- 请把流程描述变成以 1. 2. 3 这样以序号引导的步骤
nce_cost/README.md
Outdated
| ## 训练阶段 | ||
| 训练直接运行``` python train.py ```。程序第一次运行会检测用户缓存文件夹中是否包含imikolov数据集,如果未包含,则自动下载。运行过程中,每1000个iteration会打印模型训练信息,主要包含训练损失,每个pass计算一次测试损失,并会保存一次模型。 | ||
|
|
||
| 在PaddlePaddle中也有已经实现好的nce layer,这里有一些参数需要自行根据实际场景进行设计,例如param\_attr和bias\_attr这两个参数,这是用来设置参数名字,这是为了后面预测阶段好来实现网络的参数共享,具体内容下一个章节里会称述。num\_neg\_samples参数负责控制对负样例的采样个数,同时也是相对正样例的采样倍数。neg\_distribution可以控制生成负样例标签的分布,默认是一个均匀分布。act参数表示激活函数,根据NCE的原理,这里应该使用sigmoid函数。 |
There was a problem hiding this comment.
- 在PaddlePaddle中也有已经实现好的nce layer --> PaddlePaddle中的NCE layer。全文请统一, NCE这个简写出现时,全部用大写。
- 称述 --> 陈述
- 例如param_attr和bias_attr这两个参数,这是用来设置参数名字,这是为了后面预测阶段好来实现网络的参数共享
- 口语化太严重。改为:例如: param_attr设置了参数名字,因为,……
- 为什么后面预测阶段好来实现网络的参数共享,请不要直接抛出这样的概念/做法,请统筹行文的逻辑,给出原因。
- 同时也是相对正样例的采样倍数。 ----> 这句话没懂
- 请把每一个要解释的点用 list 列表的形式列清楚,保证条理性
- 口语化太严重,请重新完善
nce_cost/README.md
Outdated
| 在PaddlePaddle中也有已经实现好的nce layer,这里有一些参数需要自行根据实际场景进行设计,例如param\_attr和bias\_attr这两个参数,这是用来设置参数名字,这是为了后面预测阶段好来实现网络的参数共享,具体内容下一个章节里会称述。num\_neg\_samples参数负责控制对负样例的采样个数,同时也是相对正样例的采样倍数。neg\_distribution可以控制生成负样例标签的分布,默认是一个均匀分布。act参数表示激活函数,根据NCE的原理,这里应该使用sigmoid函数。 | ||
|
|
||
| ## 预测阶段 | ||
| 预测直接运行``` python infer.py ```,程序会首先load最新模型,然后按照batch方式进行预测,并打印预测结果。预测阶段最重要的就是共享NCE layer中的逻辑回归训练得到的参数,因为PaddlePaddle里的NCE层并不支持直接用在预测时进行输出,所以必须自己重新写一个推断层,推断层的参数为训练时的参数,所以需要参数共享。 |
There was a problem hiding this comment.
- 因为PaddlePaddle里的NCE层并不支持直接用在预测时进行输出,所以必须自己重新写一个推断层,推断层的参数为训练时的参数,所以需要参数共享。
- 不是因为Paddle不支持,是因为训练和预测计算逻辑本来就不一样
- 不是”必须自己重新写“,而是只需要换层+参数共享,这和重写不一样。
- ”重新写一个推断层“这种表述让人会问:怎么写?
nce_cost/README.md
Outdated
| ## 预测阶段 | ||
| 预测直接运行``` python infer.py ```,程序会首先load最新模型,然后按照batch方式进行预测,并打印预测结果。预测阶段最重要的就是共享NCE layer中的逻辑回归训练得到的参数,因为PaddlePaddle里的NCE层并不支持直接用在预测时进行输出,所以必须自己重新写一个推断层,推断层的参数为训练时的参数,所以需要参数共享。 | ||
|
|
||
| 参数分享的方法,通过paddle.attr.Param方法获取参数值,并参数值传入paddle.layer.trans\_full\_matrix\_projection对隐层输出向量hidden\_layer做一个矩阵右乘,从而得到最后的类别向量,将类别向量输入softmax做一个归一操作,从而得到最后的类别概率分布。 |
There was a problem hiding this comment.
- 分享-->共享
- 通过paddle.attr.Param方法获取参数值,并参数值传入 --> 没有获取参数这个步骤,直接硬性指定参数名
- 配置里为什么引入了transpose_full_matrix_projection 这里没解释。
There was a problem hiding this comment.
2 Paddle会自行在模型寻找这个参数名的参数,并获取,我表达没清楚。。
| 参数分享的方法,通过paddle.attr.Param方法获取参数值,并参数值传入paddle.layer.trans\_full\_matrix\_projection对隐层输出向量hidden\_layer做一个矩阵右乘,从而得到最后的类别向量,将类别向量输入softmax做一个归一操作,从而得到最后的类别概率分布。 | ||
|
|
||
| 代码实现如下: | ||
|
|
There was a problem hiding this comment.
请在解释NCE 参数的时候贴这段代码,然后针对代码一一解释。
|
|
||
| $$ | ||
| { P }^{ h }(D=1|w,\theta )=\frac { { P }_{ \theta }^{ h }(w) }{ { P }^{ h }_{ \theta }(w)+k{ P }_{ n }(w) } =\sigma (\Delta { s }_{ \theta }^{ }(w,h)) | ||
| $$ |
There was a problem hiding this comment.
这个公式太长了,在github中无法显示。19行和22行的公式都是同样的问题。
There was a problem hiding this comment.
在我本地上显示并没有问题啊?要不要换成图片?
There was a problem hiding this comment.
done. 将公式简化,可以解决这个问题
lcy-seso
left a comment
There was a problem hiding this comment.
LGTM and I will further refine this demo.
Deleted unnecessary mkldnn parameter
resolve #6